<?php

namespace Dreamcat\Class2Array\Enum;

use MyCLabs\Enum\Enum;

/**
 * json_encode的可选项
 * @author vijay
 * @method static JsonEncodeOption JSON_HEX_QUOT()
 * @method static JsonEncodeOption JSON_HEX_TAG()
 * @method static JsonEncodeOption JSON_HEX_AMP()
 * @method static JsonEncodeOption JSON_HEX_APOS()
 * @method static JsonEncodeOption JSON_NUMERIC_CHECK()
 * @method static JsonEncodeOption JSON_PRETTY_PRINT()
 * @method static JsonEncodeOption JSON_UNESCAPED_SLASHES()
 * @method static JsonEncodeOption JSON_FORCE_OBJECT()
 * @method static JsonEncodeOption JSON_PRESERVE_ZERO_FRACTION()
 * @method static JsonEncodeOption JSON_UNESCAPED_UNICODE()
 * @method static JsonEncodeOption JSON_PARTIAL_OUTPUT_ON_ERROR()
 */
class JsonEncodeOption extends Enum
{
    /** @var int 所有的 " 转换成 \u0022 */
    public const JSON_HEX_QUOT = JSON_HEX_QUOT;
    /** @var int 所有的 < 和 > 转换成 \u003C 和 \u003E */
    public const JSON_HEX_TAG = JSON_HEX_TAG;
    /** @var int 所有的 & 转换成 \u0026 */
    public const JSON_HEX_AMP = JSON_HEX_AMP;
    /** @var int 所有的 ' 转换成 \u0027 */
    public const JSON_HEX_APOS = JSON_HEX_APOS;
    /** @var int 将所有数字字符串编码成数字（numbers） */
    public const JSON_NUMERIC_CHECK = JSON_NUMERIC_CHECK;
    /** @var int 用空白字符格式化返回的数据 */
    public const JSON_PRETTY_PRINT = JSON_PRETTY_PRINT;
    /** @var int 不要编码 / */
    public const JSON_UNESCAPED_SLASHES = JSON_UNESCAPED_SLASHES;
    /** @var int 使一个非关联数组输出一个类（Object）而非数组。 在数组为空而接受者需要一个类（Object）的时候尤其有用 */
    public const JSON_FORCE_OBJECT = JSON_FORCE_OBJECT;
    /** @var int 确保浮点值始终被编码为浮点值 */
    public const JSON_PRESERVE_ZERO_FRACTION = JSON_PRESERVE_ZERO_FRACTION;
    /** @var int 以字面编码多字节 Unicode 字符（默认是编码成 \uXXXX） */
    public const JSON_UNESCAPED_UNICODE = JSON_UNESCAPED_UNICODE;
    /** @var int 替换一些无法编码的值，而不是失败 */
    public const JSON_PARTIAL_OUTPUT_ON_ERROR = JSON_PARTIAL_OUTPUT_ON_ERROR;

    /**
     * 将多个选项的值求和
     * @param JsonEncodeOption[] $jsonEncodeOptions
     * @return int 求和后的选项
     */
    public static function sumOptions(array $jsonEncodeOptions): int
    {
        $sum = 0;
        foreach ($jsonEncodeOptions as $jsonEncodeOption) {
            $sum |= $jsonEncodeOption->getValue();
        }
        return $sum;
    }
}

# end of file
